import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // API的base_url
  timeout: 15000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送之前做一些处理
    const token = localStorage.getItem('token')
    // 让每个请求携带token
    config.headers['token'] = `${token}`

    // 对于FormData不要尝试转换或设置content-type，让浏览器自动处理
    if (config.data instanceof FormData) {
      // 确保不会修改FormData的请求头
      config.headers = {
        ...config.headers,
        'X-Requested-With': 'XMLHttpRequest'
      }
    }

    return config
  },
  error => {
    // 处理请求错误
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    console.log('API响应数据:', response.data)
    const res = response.data

    // 如果返回的是成功状态，直接返回数据
    if (res.success === true || (res.code && res.code === 200)) {
      return res
    }

    // 处理错误响应
    const errorMsg = res.msg || res.message || '系统错误'

    // 处理凭据相关错误
    if (res.code === 401 || res.code === 400 || (res.msg && res.msg.includes('Token')) || (res.message && res.message.includes('Token'))) {
      ElMessage.error('登录状态已过期，请重新登录')
      localStorage.removeItem('token')
      localStorage.removeItem('user')

      // 延迟跳转，避免路由冲突
      setTimeout(() => {
        router.replace('/login')
      }, 1000)

    } else {
      ElMessage.error(errorMsg)
    }

    return Promise.reject(new Error(errorMsg))
  },
  error => {
    console.log('网络请求错误:', error)

    let message = error.message
    if (error.response) {
      switch (error.response.status) {
        case 401:
          message = '未授权，请重新登录'
          // 清除token和用户信息
          localStorage.removeItem('token')
          localStorage.removeItem('user')
          // 延迟跳转，避免路由冲突
          setTimeout(() => {
            router.replace('/login')
          }, 1000)
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求错误，未找到该资源'
          break
        case 500:
          message = '服务端错误'
          break
        default:
          message = `连接错误${error.response.status}`
      }
    } else if (error.message.includes('timeout')) {
      message = '请求超时，请检查网络连接'
    } else {
      message = '网络错误，请检查您的网络连接'
    }

    ElMessage.error(message)
    return Promise.reject(error)
  }
)

// 封装GET请求
export function get(url, params, config = {}) {
  return service({
    url,
    method: 'get',
    params,
    ...config
  })
}

// 封装POST请求
export function post(url, data, config = {}) {
  return service({
    url,
    method: 'post',
    data,
    ...config
  })
}

// 封装PUT请求
export function put(url, data, config = {}) {
  return service({
    url,
    method: 'put',
    data,
    ...config
  })
}

// 封装DELETE请求
export function del(url, params, config = {}) {
  return service({
    url,
    method: 'delete',
    params,
    ...config
  })
}

export default service